package com.arrayup;

/**
 * @Author WaveHi
 * @Date 12/8/2021 上午 10:39
 * @Version 1.0
 * @Contact HJBWaveHi@163.com
 * @Description 二分查找
 */
public class BinarySearch {

    public static void main(String[] args) {

        //获取需查找的数据
        int destData = 10;

        //获取数据源
        int[] nums = {1,2,4,5,10,11,15,17};

        //接收查找范围内的开始位置
        int startIndex = 0;

        //接收查找范围的结束位置
        int endIndex = nums.length - 1;

        //接收查找范围的中间位置
        int midIndex = -1;

        //查找开始
        while(true) {

            //判断数组中是否存在需查找的数据
            if (destData > nums[nums.length - 1] || destData < nums[0]) {

                break;

            }

            //获取查找范围的中间位置
            midIndex = (startIndex + endIndex) / 2;

            //判断需查找数据位于那个范围
            if(destData > nums[midIndex]) {

                startIndex = midIndex + 1;

            } else if(destData < nums[midIndex]) {

                endIndex = midIndex - 1;

            } else {

                break;

            }


        }
        if(midIndex > -1) {

            System.out.println("需查找数据位置为" + midIndex);

        }else {

            System.out.println("需查找数据不在数组中");

        }

    }

}

/*
1.每次查找的流程一致可以使用循环或方法的递归
2.若使用循环来完成查找操作，需查找的数组的范围不确定，查找的次数不确定需用while循环
3.获取需查找范围的中间位置的数据来对需查找的范围进行拆分
4.判断需查找数据位于那个范围
5.若中间的位置即为所查找数据，则查找操作完成，退出循环
6.循环查找

 */
